/******************************************************************************
 *  _____     _____
 *  \  __\    \  __\
 *   \ \_\\    \ \_\\
 *    \  __\SS  \  __\roject
 *     \_\       \_\
 *
 * Mateusz Maciąg, Rafał Urbański
 * Komputerowe Systemy Sterowania
 *****************************************************************************/

#ifndef OPENLOOPCONTROLLER_H
#define OPENLOOPCONTROLLER_H

#include "SimInterface/ISimulator.h"
#include "ControllerBase.h"

// Przestrzeń nazw
namespace RafMat
{
namespace SimEngine
{

/**
    Klasa pseudoregulatora pętli otwartej.

    Klasa będąca typem regulatora (ControllerBase) reprezentuje obiekt "rozwierający"
    zamkniętą pętlę sprzężenia zwrotnego.

    Zasada działania tego pseudoregulatora polega na przekazywaniu wartości zadanej
    wprost na wyjście obiektu (bypassing). Tymczasem wejście regulatora, czyli
    w praktyce wartość wzięta ze sprzężenia zwrotnego jest zupełnie ignorowana.

    Regulator ten sprawia, że zamknięty układ regulacji posiada cechy układu otwartego.
    Przydatny jest np. przy testowaniu odpowiedzi skokowych obiektów regulacji.
*/
class OpenLoopController : public ControllerBase
{
public:
    /**
        Tworzy nowy pseudoregulator i wiąże go z obiektem symulatora.

        \param [in] isim Obiekt symulatora.
    */
    explicit OpenLoopController(SimInterface::ISimulator &isim);

    //
    // Implementacja IConfigurable
    //

    /**
        Dla tego typu obiektu rzuca wyjątek nierozpoznanego parametru.
    */
    bool setParameter(const std::string& param, const std::string& value) throw(std::logic_error);

    /**
        Przekazuje strumień dalej nie modyfikując go.
    */
    SimFile::ConfigWriter& dumpParameters(SimFile::ConfigWriter& o) const;

    /**
        Resetuje regulator (dla typu open-loop nie robi nic).
    */
    void reset() {}
protected:

    /**
        Symulacja kroku pseudoregulatora.

        Implementacja abstrakcyjnej metody polegająca na przepisaniu wejścia processVar na wyjście
        obiektu.

        \param [in] setPoint Wartość zadana.
        \param [in] processVar Wejście regulatora (ignorowane).
        \return setPoint
    */
    double simulateControllerStep(double setPoint, double processVar);
};

}
}

#endif // OPENLOOPCONTROLLER_H
